package org.pay.union.dto.bill;

import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.pay.union.core.PlatForm;
import org.pay.union.enums.DebitCredit;
import org.pay.union.enums.TradeTypeEnum;

import java.io.Serializable;
import java.util.Objects;
import java.util.function.Function;

@Data
@ApiModel("账单详情")
public class BillDetailDto implements Serializable {
    @ApiModelProperty(value = "交易时间yyyy-MM-dd HH:mm:ss")
    protected String tradeTime;//    交易时间	yyyy-MM-dd HH:mm:ss
    @ApiModelProperty(value = "公众账号ID 微信公众账号appid，如：wx8632a91376b81e24")
    protected String appId;// 公众账号ID	微信公众账号appid，如：wx8632a91376b81e24
    @ApiModelProperty(value = "第三方商户号 如:微信商户号")
    protected String thirdMerId;// 第三方商户号	 如:微信商户号
    @ApiModelProperty(value = "商户号 平台分配的连锁商户号，如：755212000001")
    protected String mchId;// 商户号	平台分配的连锁商户号，如：755212000001
    @ApiModelProperty(value = "子商户号 平台分配的商户号，如：7551000001")
    protected String subMerNo;// 子商户号	平台分配的商户号，如：7551000001
    @ApiModelProperty(value = "设备编号 如：POS_001")
    protected String deviceNo;// 设备编号	如：POS_001
    @ApiModelProperty(value = "平台订单号")
    protected String ptOrderNo;//         平台订单号
    @ApiModelProperty(value = "银联订单号")
    protected String unionPayOrderNo;// 银联订单号
    @ApiModelProperty(value = "商户订单号")
    protected String merOrderNo;//         商户订单号
    @ApiModelProperty(value = "用户标识 用户在第三方中的id，如微信中的openid")
    protected String userTag;// 用户标识	用户在第三方中的id，如微信中的openid
    @ApiModelProperty(value = "交易类型 如：pay.weixin.native/pay.weixin.micropay/pay.weixin.jspay")
    protected String tradeType;// 交易类型	如：pay.weixin.native/pay.weixin.micropay/pay.weixin.jspay
    @ApiModelProperty(value = "交易状态 支付成功/转入退款")
    protected String tradeStatus;// 交易状态	支付成功/转入退款
    @ApiModelProperty(value = "付款银行 如：CFT")
    protected String payBank;//  付款银行	如：CFT
    @ApiModelProperty(value = "货币种类 CNY/GBP/HKD/USD/JPY/CAD/AUD/EUR")
    protected String feeType;//  货币种类	CNY/GBP/HKD/USD/JPY/CAD/AUD/EUR
    @ApiModelProperty(value = "总金额 单位：元")
    protected String totalFee;//  总金额	单位：元
    @ApiModelProperty(value = "企业红包金额 默认为空")
    protected String comFee;//  企业红包金额	默认为空
    @ApiModelProperty(value = "平台退款单号")
    protected String ptRefundNo;//  平台退款单号
    @ApiModelProperty(value = "商户退款单号")
    protected String refundNo;//          商户退款单号
    @ApiModelProperty(value = "退款金额 单位：元")
    protected String refundFee;// 退款金额	单位：元
    @ApiModelProperty(value = "企业红包退款金额 默认为空")
    protected String comRefundFee;// 企业红包退款金额	默认为空
    @ApiModelProperty(value = "退款类型 ORIGINAL:原路返回")
    protected String refundTypeS;// 退款类型	ORIGINAL:原路返回
    @ApiModelProperty(value = "退款状态 退款成功")
    protected String refundStatus;// 退款状态	退款成功
    @ApiModelProperty(value = "商品名称 原样返回提交支付时的body参数的值")
    protected String commName;// 商品名称	原样返回提交支付时的body参数的值
    @ApiModelProperty(value = "商户数据包 原样返回提交支付时的attach参数的值")
    protected String attach;// 商户数据包	原样返回提交支付时的attach参数的值
    @ApiModelProperty(value = "手续费 单位：元，按笔算时保留2位小数，按汇总算时保留6位小数退款时为负值")
    protected String serviceFee;// 手续费	单位：元，按笔算时保留2位小数，按汇总算时保留6位小数退款时为负值
    @ApiModelProperty(value = "费率 如：0.35%")
    protected String rate;//  费率	如：0.35%
    @ApiModelProperty(value = "终端类型 POS,ERP,SPAY_AND,SPAY_IOS,SPAY_POS,SPAY_PC")
    protected String terminalType;// 终端类型	POS,ERP,SPAY_AND,SPAY_IOS,SPAY_POS,SPAY_PC
    @ApiModelProperty(value = "对账标识 默认返回0，预留字段后续扩展使用")
    protected String recondTag;// 对账标识	默认返回0，预留字段后续扩展使用
    @ApiModelProperty(value = "门店编号")
    protected String storeNo;//         门店编号
    @ApiModelProperty(value = "商户名称")
    protected String merName;// 商户名称
    @ApiModelProperty(value = "收银员")
    protected String opt;//        收银员
    @ApiModelProperty(value = "子商户ID/银联交易主键\t微信支付交易时为子商户ID，银联二维码交易时为银联交易主键")
    protected String subMerId;// 子商户ID/银联交易主键	微信支付交易时为子商户ID，银联二维码交易时为银联交易主键
    @ApiModelProperty(value = "免充值券金额\t订单享受免充值券优惠的金额")
    protected String discountFee;// 免充值券金额	订单享受免充值券优惠的金额
    @ApiModelProperty(value = "实收金额\t实收金额=订单金额-免充值券金额")
    protected String realFee;// 实收金额	实收金额=订单金额-免充值券金额
    @ApiModelProperty(value = "结算金额\t结算金额=实收金额-手续费")
    protected String settleFee;// 结算金额	结算金额=实收金额-手续费
    @ApiModelProperty(value = "扩展字段3\t预留字段")
    protected String ext3;// 扩展字段3	预留字段
    @ApiModelProperty(value = "扩展字段4\t预留字段")
    protected String ext4;// 扩展字段4	预留字段
    @ApiModelProperty(value = "扩展字段5\t预留字段")
    protected String ext5;// 扩展字段5	预留字段

    @ApiModelProperty(value = "支付方式枚举")
    protected TradeTypeEnum tradeTypeEnum;//        收银员
    @ApiModelProperty(value = "支付方式中文")
    protected String tradeTypeCn;//        支付方式中文

    @ApiModelProperty(value = "支付方式/银行")
    protected String bank;//        支付方式银行

    public String getBank() {
        if(Objects.isNull(tradeTypeEnum)){
            return null;
        }
        Function<String, DebitCredit> creditFunction = PlatForm.DEBIT_CREDIT_CENTER.get(tradeTypeEnum);
        if(creditFunction==null){
            return null;
        }
        return creditFunction.apply(payBank).getBank();
    }

    public String getTradeTypeCn() {
        return tradeTypeEnum==null?null:tradeTypeEnum.getCn();
    }
}
